//: C20:ListSpecialFunctions.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
#include "Noisy.h"
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
ostream_iterator<Noisy> out(cout, " ");

void print(list<Noisy>& ln, char* comment = "")
{
    cout << "\n" << comment << ":\n";
    copy(ln.begin(), ln.end(), out);
    cout << endl;
}

int main()
{
    typedef list<Noisy> LN;
    LN l1, l2, l3, l4;
    generate_n(back_inserter(l1), 6, NoisyGen());
    generate_n(back_inserter(l2), 6, NoisyGen());
    generate_n(back_inserter(l3), 6, NoisyGen());
    generate_n(back_inserter(l4), 6, NoisyGen());
    print(l1, "l1");
    print(l2, "l2");
    print(l3, "l3");
    print(l4, "l4");
    LN::iterator it1 = l1.begin();
    it1++;
    it1++;
    it1++;
    l1.splice(it1, l2);
    print(l1, "l1 after splice(it1, l2)");
    print(l2, "l2 after splice(it1, l2)");
    LN::iterator it2 = l3.begin();
    it2++;
    it2++;
    it2++;
    l1.splice(it1, l3, it2);
    print(l1, "l1 after splice(it1, l3, it2)");
    LN::iterator it3 = l4.begin(), it4 = l4.end();
    it3++;
    it4--;
    l1.splice(it1, l4, it3, it4);
    print(l1, "l1 after splice(it1,l4,it3,it4)");
    Noisy n;
    LN l5(3, n);
    generate_n(back_inserter(l5), 4, NoisyGen());
    l5.push_back(n);
    print(l5, "l5 before remove()");
    l5.remove(l5.front());
    print(l5, "l5 after remove()");
    l1.sort();
    l5.sort();
    l5.merge(l1);
    print(l5, "l5 after l5.merge(l1)");
    cout << "\n Cleanup" << endl;
} ///:~
